home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 1995 #5 & #6
/
Amiga Plus CD - 1995 - No. 5 and 6.iso
/
pd
/
serien
/
purity
/
nr.49
/
mathematik
/
fktunit.p
< prev
next >
Wrap
Text File
|
1995-06-24
|
5KB
|
116 lines
{---------------------------------------------------------}
{ unit : t_fkt.pas }
{ }
{ date : 20.12.88 }
{ compiler : turbo pascal 5.0/5.5 }
{ MS-DOS 3.3 }
{ }
{ update : 20.12.88 }
{ }
{ Autor : Reiner Schoelles }
{---------------------------------------------------------}
{ Diese Unit enthaelt eine Routine zur Berechnung von }
{ Nullstellen nach dem Bisektionsverfahren und die da- }
{ fuer benoetigte Funktion t_f. }
{ Der Benutzer muss hier seine eingene Funktion, fuer }
{ die die Nullstellen berechnet werden soll, eintragen. }
{ Vordefiniert ist die Funktion f(x) = x*x*x-x*x-x-1. }
{ Nullstelle liegt bei x0 = 1.839287 (zum Testen geeignet)}
{---------------------------------------------------------}
unit t_fkt;
{---------------------------------------------------------}
{ Interface }
{---------------------------------------------------------}
Interface
function t_f(x: real): real;
function t_bisektion(a,b,epsilon: real;
var n : integer;
var t_err : byte): real;
{---------------------------------------------------------}
{ Implementation }
{---------------------------------------------------------}
Implementation
{---------------------------------------------------------}
{ t_f }
{ Muss an eigene Beduerfnisse angepasst werden. Vor- }
{ eingestellt ist die Funktion f(x) = x*x*x-x*x-x-1, }
{ die nach dem Verfahren des fortgesetzten Ausklammerns}
{ folgende Form hat: }
{ f(x) = ((x-1) * x - 1) * x -1 }
{ Damit ist die Funktion linearisiert und effektiver }
{ zu berechnen. Sie kann selbstverstaendlich auch in }
{ der folgenden Form angegeben werden: }
{ t_f:= x*x*x-x*x-x-1; }
{ Die function t_f wird von der function t_bisektion }
{ aufgerufen. }
{---------------------------------------------------------}
function t_f;
begin
t_f:= ((x-1) * x - 1) * x -1;
end;
{---------------------------------------------------------}
{ t_bisektion }
{ Die function berechnet nach dem Bisektions- }
{ verfahren Nullstellen von reellwertigen }
{ Funktionen und gibt die Nullstelle als Er- }
{ gebnis der function zurueck. }
{ a und b (a < b) sind die beiden Intervall- }
{ grenzen, zw. denen eine Nullstelle liegt. }
{ Die Nullstelle wird als Erg. der function }
{ geliefert. Liegt ein Fehler vor, ist das }
{ Ergebnis 0. Die Variable N enthaelt die An- }
{ zahl der Iterationen, die notwendig waren, }
{ um die Nullstelle mit der angegebenen }
{ Toleranz epsilon zu ermitteln. }
{---------------------------------------------------------}
function t_bisektion;
var
stop: boolean; { true, wenn Nullstelle gefunden }
c : real; { c:= (a+b)/2 }
begin
stop := false; { Noch keine Nullstelle }
t_err:= 0; { Noch kein Fehler }
n := 0; { Anfangswert }
if a < b { a < b Bedingung }
then begin
{ Vorzeichenwechsel? }
if ((t_f(a) * t_f(b)) < 0)
then begin
repeat
c:= (a+b)/2; { Intervallhalbierung }
n:= n + 1;
if (abs(b-c) <= epsilon)
and (t_f(c) <= epsilon)
then begin { Nullstelle gefunden }
stop:= true;
t_bisektion:= c;
end
else begin { Noch keine Nullstelle }
if (t_f(b) * t_f(c) < 0)
then a:= c
else b:= c;
end;
until stop;
end
else begin { Keine Nullstelle zw. a und b }
t_err:= 1;
t_bisektion:= 0;
n:= 0;
end;
end
else begin { wenn a > b, dann Bedingung verletzt }
t_err:= 1;
t_bisektion:= 0;
n:= 0;
end;
end;
{---------------------------------------------------------}
{ End of Unit }
{---------------------------------------------------------}
end.